home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / morse / cwtsr / cwmoni.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-03-12  |  12.0 KB  |  478 lines

  1. Program CWKEY;
  2. { Monitoring program for CW TSR by S57RA }
  3.  
  4. uses
  5.   Dos,
  6.   TPString,
  7.   TPCrt,
  8.   TPCmd,
  9.   TPWindow,
  10.   TPMenu,
  11.   TPEdit;
  12.  
  13. Type Str80 = String[80];
  14.      ID_Array = Array [0..9] of byte;
  15.  
  16.  
  17. Const SoftInt : Byte = $60;
  18.       ID      : ID_Array = ($50,$53,$51,$52,$56,$57,$1E,$06,$55,$89);
  19.  
  20.  
  21. Var F_Array :Array[1..10] of str80;
  22.     w1,w2   :Word;
  23.     reg     :Registers;
  24.     txt:string[80];
  25.     Stext:String[80];
  26.  
  27.     SIP : ^ID_Array;
  28.  
  29. Const IntNo : Byte = $60;
  30.  
  31. procedure InitMenu(var M : Menu);
  32. const
  33.   Color1 : MenuColorArray = ($1E, $1B, $1E, $7E, $1E, $0E, $19, $78);
  34.   Color2 : MenuColorArray = ($1E, $1E, $1F, $7F, $1F, $0E, $19, $78);
  35.   Color3 : MenuColorArray = ($9E, $9F, $9E, $7E, $9E, $0E, $19, $78);
  36.   Frame1 : FrameArray = '╔╚╗╝═║';
  37.  
  38. begin
  39.   {Customize this call for special exit characters and custom item displays}
  40.   M := NewMenu([], nil);
  41.  
  42.   SubMenu(1,2,1,Horizontal,Frame1,Color1,'<< S57RA TSR CW key >>');
  43.     MenuWidth(80);
  44.     MenuItem('Run',2,1,1,'Running MEMKEYER');
  45.     SubMenu(3,4,1,Vertical,Frame1,Color2,'');
  46.       MenuHeight(18);
  47.       MenuItem('PTT On/Off',1,1,2,'SWITCH PTT ON/OFF');
  48.       MenuItem('QRQ',2,1,3,'Increase speed');
  49.       MenuItem('QRS',3,1,4,'Decrease speed ');
  50.       MenuItem('Pass TEXT',4,1,5,'Enter text to transmit');
  51.       MenuItem('SELECT KBD',5,1,6,'Transmit characters from keyboard, <ESC> to stop');
  52.       MenuItem('F1 text',6,1,8,'Send F1 preset text');
  53.       MenuItem('F2 text',7,1,9,'Send F2 preset text');
  54.       MenuItem('F3 text',8,1,10,'Send F3 preset text');
  55.       MenuItem('F4 text',9,1,11,'Send F4 preset text');
  56.       MenuItem('F5 text',10,1,12,'Send f5 preset text');
  57.       MenuItem('F6 text',11,1,13,'send f6 preset text');
  58.       MenuItem('F7 text',12,1,14,'Send F7 preset text');
  59.       MenuItem('F8 text',13,1,15,'Send F8 preset text');
  60.       MenuItem('F9 text',14,1,16,'Send F9 preset text');
  61.       MenuItem('F10 text',15,1,17,'Send F10 preset text');
  62.       PopSublevel;
  63.     MenuItem('Options',23,1,18,'Set parameters');
  64.     SubMenu(18,4,1,Vertical,Frame1,Color2,'');
  65.       MenuItem('Define F1..F10',1,1,19,'Enter text ');
  66.       SubMenu(29,6,1,Vertical,Frame1,Color2,'');
  67.         MenuWidth(22);
  68.         MenuItem('F1',1,1,20,'Enter F1 text');
  69.         MenuItem('F2        ',2,1,21,'Set F2 text');
  70.         MenuItem('F3',3,1,22,'');
  71.         MenuItem('F4',4,1,23,'');
  72.         MenuItem('F5',5,1,24,'');
  73.         MenuItem('F6',6,1,25,'');
  74.         MenuItem('F7',7,1,26,'');
  75.         MenuItem('F8',8,1,27,'');
  76.         MenuItem('F9',9,1,28,'');
  77.         MenuItem('F10',10,1,29,'');
  78.         PopSublevel;
  79.       MenuItem('PTT Delay',2,1,32,'Set PTT delay in mS');
  80.       MenuItem('DOT/DASH ratio',3,1,33,'Set Dot/Dash ratio');
  81.       MenuItem('DOT/PAUSE ratio',4,1,34,'Set Dot to pause ratio (0.5 - 2)');
  82.       MenuItem('DOT/Character PAUSE',5,1,35,'Set DOT to Character pause ratio');
  83.       MenuItem('VOXDELAY',6,1,36,'Set VOX delay');
  84.       MenuItem('SQUEEZE ',7,1,37,'Enable / disable iambic keying');
  85.       MenuItem('PRESET SPEED',8,1,38,'Preset speed aprox. char/min (15-250)');
  86.       MenuItem('PADDLE INTERFACE',9,1,39,'Padle iface enable/disable');
  87.       MenuItem('TSR Check',10,1,40,'Check if TSR is loaded');
  88.       MenuItem('ACTIVATE COMPORT',11,1,41,'Activate COM port interrupt triger');
  89.       MenuItem('DEACTIVATE COMPORT',12,1,42,'Deactivate TSR COMPORT trigger');
  90.       MenuItem('TONE',13,1,43,'Set tone frequency in Hz');
  91.       MenuItem('SPEAKER MONITOR',14,1,46,'Monitor enable/disable');
  92.       PopSublevel;
  93.     MenuItem('About',50,1,44,'SETING UTILITY FOR VHFCW PROGRAM by Pavle, S57RA@S50BOX.SVN.EU');
  94.     MenuItem('Exit',71,1,45,'Exit MEMKEYER');
  95.     PopSublevel;
  96.  
  97.   ResetMenu(M);
  98. end;
  99.  
  100.  
  101. {--------------------------}
  102. {-------------------------------------------------}
  103. Function Installed: Boolean;
  104. var i: integer;
  105.     p: Pointer;
  106. begin
  107.   i:=0;
  108.   GetIntVec(SoftInt, P);
  109.   SIP:=P;
  110.   While (i<10) and (SIP^[i]=ID[i]) do inc(i); { compare }
  111.   Installed:=(i>=10);
  112. end;
  113. {-------------------------------------------------}
  114.  
  115. {--------------------------}
  116.  
  117. FUNCTION  YesNo(Prompt: String;Defv:Char):Boolean;
  118. const ActiveFrame : FrameArray = '╔╚╗╝═║';
  119.       Explode     : Boolean    = True;
  120.  
  121. var ch, Ch1:char;
  122.     dx,dy,l:integer;
  123.     covers : pointer;
  124.     Win    : WindowPtr;
  125.     MOld,MaOld: Integer;
  126.     K         : Word;
  127.     Escaped:Boolean;
  128.     YN:Boolean;
  129.  
  130. begin
  131.       Mold:=WindMin;
  132.       MaOld:=WindMax;
  133.       CH1:=#255;
  134.       HiddenCursor;
  135.       Shadow:=True;
  136.       FrameChars:=ActiveFrame;
  137.  
  138.  
  139.  
  140.       if not MakeWindow(Win, 3, 16, 3+3+4+Length(Prompt),18,
  141.       true,true,false,$1E, $1B, $1E, '') then
  142.          begin
  143.            Writeln('Cannot display message');
  144.            readln;
  145.            Windmin:=MOld;
  146.            WindMax:=MaOld;
  147.            exit;
  148.          end;
  149.       if not DisplayWindow(Win) then
  150.       begin
  151.            Writeln('Cannot display message        :');
  152.            readln;
  153.            DisposeWindow(EraseTopWindow);
  154.            Windmin:=MOld;
  155.            WindMax:=MaOld;
  156.            exit;
  157.          end;
  158.       SetTopWindow(Win);
  159.       gotoxy(2,1);
  160.  
  161.       YesNo:=YesOrNo(Prompt,1,2,$1e,DefV);
  162.  
  163.       DisposeWindow(EraseTopWindow);
  164.  
  165.       Windmin:=MOld;
  166.       WindMax:=MaOld;
  167.       NormalCursor;
  168. end;  { writemsg }
  169.  
  170. {--------------------------}
  171.  
  172. FUNCTION  ReadInt(Prompt: String;NLo,NHi,Defv:integer):Integer;
  173. const ActiveFrame : FrameArray = '╔╚╗╝═║';
  174.       Explode     : Boolean    = True;
  175.  
  176. var ch, Ch1:char;
  177.     dx,dy,l:integer;
  178.     covers : pointer;
  179.     Win    : WindowPtr;
  180.     MOld,MaOld: Integer;
  181.     K         : Word;
  182.     Escaped:Boolean;
  183.     Ig:Integer;
  184.  
  185. begin
  186.       Mold:=WindMin;
  187.       MaOld:=WindMax;
  188.       CH1:=#255;
  189.       HiddenCursor;
  190.       Shadow:=True;
  191.       FrameChars:=ActiveFrame;
  192.  
  193.  
  194.  
  195.       if not MakeWindow(Win, 3, 16, 3+3+4+Length(Prompt),18,
  196.       true,true,false,$1E, $1B, $1E, '') then
  197.          begin
  198.            Writeln('Cannot display message');
  199.            readln;
  200.            Windmin:=MOld;
  201.            WindMax:=MaOld;
  202.            exit;
  203.          end;
  204.       if not DisplayWindow(Win) then
  205.       begin
  206.            Writeln('Cannot display message        :');
  207.            readln;
  208.            DisposeWindow(EraseTopWindow);
  209.            Windmin:=MOld;
  210.            WindMax:=MaOld;
  211.            exit;
  212.          end;
  213.       SetTopWindow(Win);
  214.       gotoxy(2,1);
  215.       Ig:=Defv;
  216.  
  217.       ReadInteger(Prompt,1,2,4,
  218.                       $1e, $1b,NLo, NHi, Escaped,Ig);
  219.   {-Prompt for and receive a string}
  220.       if Escaped then ReadInt:=0 else ReadInt:=Ig;
  221.  
  222.       DisposeWindow(EraseTopWindow);
  223.  
  224.       Windmin:=MOld;
  225.       WindMax:=MaOld;
  226.       NormalCursor;
  227. end;  { writemsg }
  228.  
  229. {--------------------------}
  230. FUNCTION  ReadText(Prompt: String;le:byte):String;
  231. const ActiveFrame : FrameArray = '╔╚╗╝═║';
  232.       Explode     : Boolean    = True;
  233.  
  234. var ch, Ch1:char;
  235.     dx,dy,l:integer;
  236.     covers : pointer;
  237.     Win    : WindowPtr;
  238.     MOld,MaOld: Integer;
  239.     K         : Word;
  240.     Escaped:Boolean;
  241.     St:String;
  242.  
  243. begin
  244.       Mold:=WindMin;
  245.       MaOld:=WindMax;
  246.       CH1:=#255;
  247.       HiddenCursor;
  248.       Shadow:=True;
  249.       FrameChars:=ActiveFrame;
  250.  
  251.  
  252.  
  253.       if not MakeWindow(Win, 3, 16, 3+le+4+Length(Prompt),18,
  254.       true,true,false,$1E, $1B, $1E, '') then
  255.          begin
  256.            Writeln('Cannot display message');
  257.            readln;
  258.            Windmin:=MOld;
  259.            WindMax:=MaOld;
  260.            exit;
  261.          end;
  262.       if not DisplayWindow(Win) then
  263.       begin
  264.            Writeln('Cannot display message        :');
  265.            readln;
  266.            DisposeWindow(EraseTopWindow);
  267.            Windmin:=MOld;
  268.            WindMax:=MaOld;
  269.            exit;
  270.          end;
  271.       SetTopWindow(Win);
  272.       gotoxy(2,1);
  273.       St:='';
  274.       ReadString(Prompt,1,2,Le,
  275.                      $1E, $1B, $1E,Escaped, St);
  276.   {-Prompt for and receive a string}
  277.       if Escaped then ReadText:='' else ReadText:=ST;
  278.  
  279.       DisposeWindow(EraseTopWindow);
  280.  
  281.       Windmin:=MOld;
  282.       WindMax:=MaOld;
  283.       NormalCursor;
  284. end;  { writemsg }
  285.  
  286. {--------------------------}
  287. Procedure CI(F,P:Word);
  288. begin
  289.   With reg do
  290.   begin
  291.     AH:=$30;
  292.     AL:=F;
  293.     BX:=P;
  294.     Intr(SoftInt,reg);
  295.   end;
  296. end;
  297. {--------------------------}
  298. Procedure CIT(F,P:Word;var ST:String);
  299. begin
  300.   With reg do
  301.   begin
  302.     AH:=$30;
  303.     AL:=F;
  304.     bx:=Seg(St); cx:=Ofs(St);
  305.     Intr($60,reg);
  306.   end;
  307. end;
  308. {--------------------------}
  309.  
  310. var
  311.   M : Menu;
  312.   Ch : Char;
  313.   Key : MenuKey;
  314.   Co: Integer;
  315.  
  316. begin
  317.   If (ParamStr(1)<>'') then
  318.   begin
  319.     Val(ParamStr(1), SoftInt, Co);
  320.     if (Co<>0) or (Softint>255) or (SoftInt<$60) then
  321.     begin
  322.      Writeln ('Invalid parameter for soft. interrupt, valid $60 - $255');
  323.      Exit;
  324.     end;
  325.   end;
  326.   if not Installed then
  327.   begin
  328.     Writeln('This program can only be used when VHFCW tsr is loaded.');
  329.     Writeln;
  330.     Writeln('If VHFCW is loaded, and soft. interrupt<>$60 then use');
  331.     Writeln('CWMONI $XX  - XX is interrupt number');
  332.     Exit;
  333.   end;
  334.  
  335.   TPEdit.WindowRelative:= True;
  336.   FillChar(F_Array, SizeOf(F_Array),0);
  337.   CLRSCR;
  338.   InitMenu(M);
  339.  Repeat
  340.   Key := MenuChoice(M, Ch);
  341.   Case Key Of
  342.     2:begin  { PTT }
  343.        CI(2,0);
  344.       end;
  345.     3:begin
  346.        CI(3,0);
  347.       end;
  348.     4:begin
  349.        CI(4,0);
  350.       end;
  351.     5:begin
  352.        Stext:=ReadText('CW Text:',40);
  353.        CIT(5,0,Stext);
  354.       end;
  355.     6:begin
  356.        repeat
  357.          Ch:=ReadKey;
  358.          SText:=Ch;
  359.          CIT(5,0,Stext);
  360.        until Ch=#27;
  361.       end;
  362.     7:begin
  363.        Repeat
  364.          Ch:=Chr(Random(27)+65);
  365.          SText:=Ch;
  366.          CIT(5,0,Stext);
  367.        Until not Keypressed;
  368.       end;
  369.     8:begin
  370.         CIT(5,0,F_Array[1]);
  371.       end;
  372.     9:begin
  373.         CIT(5,0,F_Array[2]);
  374.       end;
  375.     10:begin
  376.         CIT(5,0,F_Array[3]);
  377.       end;
  378.     11:begin
  379.         CIT(5,0,F_Array[4]);
  380.       end;
  381.     12:begin
  382.         CIT(5,0,F_Array[5]);
  383.       end;
  384.     13:begin
  385.         CIT(5,0,F_Array[6]);
  386.       end;
  387.     14:begin
  388.         CIT(5,0,F_Array[7]);
  389.       end;
  390.     15:begin
  391.         CIT(5,0,F_Array[8]);
  392.       end;
  393.     16:begin
  394.         CIT(5,0,F_Array[9]);
  395.       end;
  396.     17:begin
  397.         CIT(5,0,F_Array[10]);
  398.       end;
  399.     20:begin
  400.        F_Array[1]:=ReadText('F1:',60);
  401.       end;
  402.     21:begin
  403.        F_Array[2]:=ReadText('F2:',60);
  404.       end;
  405.     22:begin
  406.        F_Array[3]:=ReadText('F3:',60);
  407.       end;
  408.     23:begin
  409.        F_Array[4]:=ReadText('F4:',60);
  410.       end;
  411.     24:begin
  412.        F_Array[5]:=ReadText('F5:',60);
  413.       end;
  414.     25:begin
  415.        F_Array[6]:=ReadText('F6:',60);
  416.       end;
  417.     26:begin
  418.        F_Array[7]:=ReadText('F7:',60);
  419.       end;
  420.     27:begin
  421.        F_Array[8]:=ReadText('F8:',60);
  422.       end;
  423.     28:begin
  424.        F_Array[9]:=ReadText('F9:',60);
  425.       end;
  426.     29:begin
  427.        F_Array[10]:=ReadText('F10:',60);
  428.       end;
  429.     31:begin
  430.  
  431.       end;
  432.     32:begin
  433.          CI(6,ReadInt('PTT DELAY mS [1..(80)..999]:',1,999,80));
  434.       end;
  435.     33:begin
  436.          CI(7,ReadInt('RATIO DOT/DASH [10..(35)..50]:',10,50,35))
  437.       end;
  438.     34:begin
  439.          CI(8,ReadInt('RATIO DOT/PAUSE [2..(10)..50]:',2,50,10))
  440.       end;
  441.     35:begin
  442.          CI(9,ReadInt('RATIO DOT/CHAR.PAUSE [2..30..100]:',2,100,30))
  443.       end;
  444.     36:begin
  445.          CI(10,ReadInt('VOX DELAY mS [50..(300)..2000]:',50,2000,300));
  446.       end;
  447.     37:begin
  448.          if YesNo('IAMBIC KEYING ENABLE [(Y),N]','Y') then
  449.          CI(11,1) else CI(11,0);
  450.       end;
  451.     38:begin
  452.          CI(1,ReadInt('APROX. SPEED Ch/min [10..(80)..260]:',10,260,80))
  453.       end;
  454.     39:begin
  455.         if YesNo('PADDLE INTERFACE CONNECTED [(Y),N]','Y') then
  456.         CI(13,1) else CI(13,0);
  457.       end;
  458.     40:begin
  459.         CI(14,0)
  460.       end;
  461.     41:begin
  462.         CI(15,0)
  463.       end;
  464.     42:begin
  465.         CI(16,0)
  466.       end;
  467.     43:begin
  468.         CI(17,ReadInt('CW MONITOR TONE Fq Hz [50..(600)..2000]:',50,2000,500))
  469.       end;
  470.     46:begin
  471.          if YesNo('PC SPEAKER MONITOR ENABLE [(Y),N]','Y') then
  472.          CI(12,1) else CI(12,0);
  473.       end;
  474.   end;
  475.  Until Key=45;            { case }
  476.   EraseMenu(M, False);
  477. end.
  478.